#define _CRT_SECURE_NO_WARNINGS 1


//#include<vector>
//#include<iostream>
//
//using namespace std;
//
//int pivotIndex(vector<int>& nums)
//{
//    int size = nums.size();
//    vector<int> dp(size + 1, 0);
//    for (int i = 0; i < size; i++)
//    {
//        dp[i + 1] = dp[i] + nums[i];
//    }
//    for (int i = 0; i < size; i++)
//    {
//        if ((dp[size] - nums[i]) % 2 == 0)
//        {
//            if (dp[i] == (dp[size] - nums[i]) / 2)
//            {
//                return i;
//            }
//        }
//    }
//    return -1;
//}
//
//int main()
//{
//    vector<int> v = { 1, 7, 3, 6, 5, 6 };
//    cout << pivotIndex(v) << endl;
//
//	return 0;
//}


//#include<map>
//#include<vector>
//#include<iostream>
//
//using namespace std;
//
//int subarraySum(vector<int>& nums, int k)
//{
//    int size = nums.size();
//    map<int, int> hash;
//    hash[0] = 1;
//    int sum = 0, count = 0;
//    for (auto& e : nums)
//    {
//        sum += e;
//        if (hash.count(sum - k))
//        {
//            count += hash[sum - k];
//        }
//        hash[sum]++;
//    }
//    return count;
//}
//
//int main()
//{
//    vector<int> v = { 1,2,3 };
//    cout << subarraySum(v, 3) << endl;
//
//	return 0;
//}


#include<vector>
#include<iostream>

using namespace std;

vector<int> productExceptSelf(vector<int>& nums)
{
    int size = nums.size();
    vector<int> v(size);
    vector<int> front(size), rear(size);
    front[0] = rear[size - 1] = 1;
    for (int i = 1; i < size; i++)
    {
        front[i] = front[i - 1] * nums[i - 1];
    }
    for (int i = size - 2; i >= 0; i--)
    {
        rear[i] = rear[i + 1] * nums[i + 1];
    }
    for (int i = 0; i < size; i++)
    {
        v[i] = front[i] * rear[i];
    }
    return v;
}

int main()
{
    vector<int> v = { 1,2,3,4 };
    vector<int> ret = productExceptSelf(v);
    for (auto& e : ret)
    {
        cout << e << ' ';
    }
    cout << endl;

	return 0;
}